package com.easyfile.easyfilemaster.controller;


import com.easyfile.easyfilemaster.entity.UserInfo;
import com.easyfile.easyfilemaster.entity.annotations.RateLimit;
import com.easyfile.easyfilemaster.entity.base.LoginResult;
import com.easyfile.easyfilemaster.entity.base.Result;
import com.easyfile.easyfilemaster.entity.base.ValidateRegex;
import com.easyfile.easyfilemaster.entity.dto.*;
import com.easyfile.easyfilemaster.service.UserService;
import com.easyfile.easyfilemaster.utils.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

/**
 * 用户请求接口
 * @author chenpeman
 * @date 2022年05月05日 21:54
 */
@RestController
@RequestMapping("/user/")
@Validated
@Slf4j
public class UserController {
    @Resource
    UserService userService;

    /**
     * 用户登录
     *
     * @param loginDto 登陆参数集合
     * @return 用户登录结果 login result
     */
    @PostMapping("login")
    @RateLimit(limit = 10)
    public LoginResult<UserInfo> login(
            @Validated LoginDto loginDto){
        return userService.login(loginDto);
    }

    /**
     * 获取短信验证码
     *
     * @param mobile the mobile
     * @return 获取结果
     */
    @PostMapping("getVerCode")
    @RateLimit(limit = 1,expire = 60)
    Result<Void> getVerCode(
            @NotBlank(message = "手机号不能为空")
            @Pattern(regexp = ValidateRegex.MOBILE, message = "请输入正确的手机号") String mobile){
        return userService.getVerCode(mobile);
    }

    /**
     * 手机号注册
     *
     * @param mobileRegisterDto the mobile register dto
     * @return 注册成功后返回用户信息 login result
     */
    @PostMapping("mobileRegister")
    @RateLimit(limit = 10)
    LoginResult<UserInfo> mobileRegister(
            @Validated MobileRegisterDto mobileRegisterDto){
        return userService.mobileRegister(mobileRegisterDto);
    }

    /**
     * 校验token是否合法
     *
     * @param token the token
     * @return 成功后续期token，并返回用户信息
     */
    @PostMapping("checkToken")
    @RateLimit(limit = 10)
    LoginResult<UserInfo> checkToken(
            @NotBlank(message = "token不能为空") String token){
        return userService.checkToken(token);
    }

    /**
     * 更新用户基本信息
     *
     * @param dto the user detail
     * @return the result
     */
    @PostMapping("updateUser")
    @RateLimit(limit = 10)
    Result<Void> updateUser(
            @Validated  UpdateUserDto dto,
            @RequestHeader("X-Token") String token){
        Long userId = JwtUtil.getUserIdByToken(token);
        dto.setUserId(userId);
        return userService.updateUser(dto);
    }

    /**
     * 更新用户密码
     *
     * @param dto the dto
     * @return the result
     */
    @PostMapping("updateUserPassword")
    @RateLimit(limit = 10)
    Result<Void> updateUserPassword(
            @Validated  UpdateUserPasswordDto dto,
            @RequestHeader("X-Token") String token){
        Long userId = JwtUtil.getUserIdByToken(token);
        dto.setUserId(userId);
        return userService.updateUserPassword(dto);
    }

    /**
     * 更新用户手机号
     *
     * @param dto   the dto
     * @param token the token
     * @return the result
     */
    @PostMapping("updateUserMobile")
    @RateLimit(limit = 10)
    public Result<Void> updateUserMobile(
            @Validated UpdateUserMobileDto dto,
            @RequestHeader("X-Token") String token){
        Long userId = JwtUtil.getUserIdByToken(token);
        dto.setUserId(userId);
        return userService.updateUserMobile(dto);
    }
}
